home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / NANOTECH.ZIP / SOUND.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-17  |  8.0 KB  |  255 lines

  1. /**************************************************************************
  2.                         VARMINT'S AUDIO TOOLS 0.61
  3.  
  4.   SOUND.H
  5.  
  6.   Written by:  Eric Jorgensen (Aug, 1995)
  7.                     smeagol@rt66.com
  8.  
  9.                         *** NOTICE ***
  10.  
  11.   Use Varmint's Audio Tools at your own risk.  This package is not
  12.   garanteed to work safely on any computer.
  13.  
  14. **************************************************************************/
  15.                                // Stuff to include
  16. #include <stddef.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <dos.h>
  20. #include <malloc.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <time.h>
  24. //#include "math.h"
  25. //#include <values.h>
  26.                                // More definitions than you can
  27.                                // shake a stick at.
  28. #define VAT_VERSION "0.61"
  29.  
  30.                                // Pointer type definition for samples.
  31.                                // This definition should be far or
  32.                                // huge.  If you use near, you will have
  33.                                // to change the code to use malloc()
  34.                                // instead of farmalloc()
  35. #define SAMPLE signed char
  36.  
  37. #define MAXSOUNDS 16
  38. #define MAXSOUNDTOKENS 50
  39.  
  40. #define WORD    unsigned short
  41. #define DWORD   unsigned int
  42. #define BYTE    unsigned char
  43. #define FALSE   0
  44. #define TRUE    1
  45.  
  46. #define TIMEOUT           32000
  47.  
  48. #define DSP_DETECT        0x02
  49. #define DSP_GET_VERS      0xe1
  50. #define DSP_INVOKE_INTR   0xf2
  51. #define DSP_RESET         0x06
  52. #define DSP_READ          0x0a
  53. #define DSP_RSTATUS       0x0e
  54. #define DSP_SAMPLE_RATE   0x40
  55. #define DSP_SILENCE       0x80
  56. #define DSP_SPKR_ON       0xd1
  57. #define DSP_SPKR_OFF      0xd3
  58. #define DSP_WRITE         0x0c
  59. #define DSP_WSTATUS       0x0c
  60.  
  61. #define FM_ADLIB_ADDRESS  0x388
  62. #define FM_BOTH_OFF       0x08
  63. #define FM_DETECT         0x01
  64. #define FM_LEFT_OFF       0x00
  65. #define FM_RIGHT_OFF      0x02
  66.  
  67. #define FM_HIHAT          0x01
  68. #define FM_TOPCYM         0x02
  69. #define FM_TOMTOM         0x04
  70. #define FM_SNARE          0x08
  71. #define FM_BASS           0x10
  72.  
  73. //----------------------------------- Enumerations
  74.  
  75.  
  76. typedef enum {bit8=0,bit4=1,bit26=2,bit2=3,high} playmode;
  77. typedef enum {none,nodsp,adlib,sb20,sbpro} cardtype;
  78. typedef enum {fmerr=0,nodsperr,irqerr,dmacherr,nomem} SBERROR;
  79. typedef enum {v_play,v_stop,v_pause,v_resume,v_rewind,v_setrepeat,v_setpos,
  80.               v_setrate,v_setvolume } VATCOMMAND;
  81. typedef enum {v_fancy,v_plain,v_unused} VATPLAYTYPE;
  82.  
  83. //----------------------------------- Structures
  84.  
  85. typedef struct {
  86.   DWORD         position;
  87.   WORD          offset,rlength,end;
  88.   WORD          sample_number;
  89.   WORD          *pos;
  90.   WORD          counter,pinc;
  91.   WORD          period,period2,vibdepth,vibperiod;
  92.   WORD          count;
  93.   int           data1,data2,data3,data4;
  94.   int           vslide;
  95.   int           porta;
  96.   signed char   volume,volume2;
  97.   signed char   cut;
  98.   BYTE          effect,x,y;
  99.   BYTE          retrigger;
  100.   SAMPLE        *sdata;
  101. } CHANNEL;
  102.  
  103. typedef struct mod {
  104.   char          title[20];
  105.   char          sample_name[32][22];
  106.   WORD          slength[32],offset[32],repeat[32];
  107.   signed char   finetune[32];
  108.   BYTE          volume[32],num_positions;
  109.   BYTE          maxpattern,ptable[128],sig[5];
  110.   BYTE          *pattern_data[128];
  111.   BYTE          num_samples;
  112.   SAMPLE        *sdata[32];
  113.   int           repeatmusic;
  114.   struct mod    *chain;
  115.   void          (*chainfunc)(struct mod *);
  116. } MOD;
  117.  
  118. typedef struct {                      // MIDI Voice data structure
  119.   int owner_track;
  120.   int owner_channel;
  121.   int active;
  122.   int note;
  123.   int volume;
  124. } VOICE;
  125.  
  126.  
  127. typedef struct midi {                 // MIDI data structure
  128.   int    format;                      // 0 or 1
  129.   int    num_tracks;                  // 1 - 16
  130.   int    divisions;                   // number ticks per quarter note
  131.   BYTE   *track[16];                  // Track data pointers
  132.   int    repeat;
  133.   struct midi *chain;
  134.   void   (*chainfunc)(struct midi *);
  135. } MIDI;
  136.  
  137. typedef struct soundeffect {
  138.   SAMPLE  *data;                      // pointer to sound data
  139.   DWORD   length;                     // length of the sample iin bytes
  140.   DWORD   position;                   // data position used internally by sbint
  141.   WORD    *pos;                       // pointer to current byte position
  142.   WORD    pinc;                       // rate counter
  143.   int     repeat;                     // number of times to repeat sample
  144.   BYTE    volume;                     // volume of the sample
  145.   BYTE    active;                     // indicates wether sample is playing
  146.   DWORD   id;
  147.   VATPLAYTYPE     type;               // fancy or plain
  148.   struct soundeffect *chain;          // sound effect to jump to when done
  149.   struct soundeffect *next;           // Used internally for a linked list
  150.   void (*chainfunc)(struct soundeffect *);
  151. } SOUNDEFFECT;
  152.  
  153.  
  154. //----------------------------------- FM functions
  155.  
  156. int     FMDetect(void);
  157. void    FMWrite(WORD data);
  158. void    FMReset(void);
  159. BYTE    FMStatus(void);
  160. void    FMSetVoice(BYTE voice,BYTE *ins);
  161. void    FMSetNote(BYTE voice,BYTE note);
  162. void    FMSetFrequency(BYTE voice,WORD freq);
  163. void    FMKeyOn(BYTE voice);
  164. void    FMKeyOff(BYTE voice);
  165. void    FMSetVolume(BYTE voice,BYTE vol);
  166. void    FMSetRythmMode(BYTE bool);
  167. void    FMRythmOn(BYTE inst);
  168. void    FMRythmOff(BYTE inst);
  169.  
  170. //----------------------------------- DSP functions
  171.  
  172.  
  173. int     DSPReset(void);
  174. BYTE    DSPRead(void);
  175. void    DSPWrite(BYTE output);
  176. WORD    DSPGetVersion(void);
  177.  
  178. //----------------------------------- Timer functions
  179.  
  180. void    TimerOn(void);
  181. DWORD    TimerOff(void);
  182. void    InstallTimer0(WORD period,void (*func)(void));
  183. void    RemoveTimer0(void);
  184. void _saveregs MilliDelay(WORD delay);
  185. void _saveregs MicroDelay(WORD delay);
  186. void    InitTimerFunctions(void);
  187.  
  188.  
  189. //----------------------------------- MIDI/MPU functions
  190.  
  191. int     MPUEnter(void);
  192. void    MPUExit(void);
  193. void    MPUWrite(BYTE b);
  194.  
  195.  
  196. //----------------------------------- File I/O functions
  197.  
  198. MIDI      *LoadMidi(char *filename, char *errstring);
  199. MOD       *LoadMod(char *filename, char *errstring);
  200. int       LoadInstruments(char *filename,BYTE inst[128][11]);
  201.  
  202.  
  203. //----------------------------------- Sound Effect interface functions
  204.  
  205. int     AddChainFunction(DWORD id,void (*func)(SOUNDEFFECT *));
  206. void    AlterSoundEffect(DWORD id,VATCOMMAND c,int parameter);
  207. DWORD   ChainSoundEffect(SAMPLE *data,DWORD length,VATPLAYTYPE type,DWORD id);
  208. DWORD   PlaySound(SAMPLE *data,DWORD length,VATPLAYTYPE type);
  209.  
  210. //----------------------------------- Other functions
  211.  
  212. WORD    SetSampleRate(WORD rate);
  213. int     SBSetUp(void);
  214. void    SBCleanUp(void);
  215. SAMPLE  *LoadWave(char *wavefile,unsigned int *length);
  216. void    GoVarmint(void);
  217. void    DropDeadVarmint(void);
  218. void    MPUWrite(BYTE b);
  219. void    FreeMidi(MIDI *m);
  220. void    FreeMod(MOD *freeme);
  221. void    VarmintVSync(void);
  222. void    TimeVSync(void);
  223. void    ModCommand(VATCOMMAND c);
  224. void    MidiCommand(VATCOMMAND c);
  225. int     PercentOverhead(WORD ticks);
  226. void    real_free(int handle);
  227. void    *real_malloc(WORD size,int* handle);
  228.  
  229.  
  230. //----------------------------------- Global Variables
  231.  
  232.                                       // MIDI parameters
  233. extern MIDI     *midi_data;
  234. extern WORD     midi_mpuport;
  235. extern int      midi_usertempo;
  236. extern int      midi_mpuout;
  237. extern int      midi_fmout;
  238. extern BYTE     midi_volume;
  239. extern BYTE     *midi_patchmap;
  240. extern BYTE     *midi_fmpatchmap;
  241.                                       // MOD parameters
  242. extern MOD      *mod_data;
  243. extern int      mod_bytespertick;
  244. extern int      mod_volume;
  245. extern BYTE     channel_select[4];
  246.                                       // Miscellaneous
  247. extern char     *errname[];
  248. extern volatile DWORD    vclock;
  249. extern SBERROR  sberr;
  250. extern volatile WORD     DSP_overhead;
  251. extern volatile WORD     vsyncclock;
  252. extern volatile BYTE     sync_on;
  253. extern short      debug_lowdsp;
  254. extern volatile short      debug_reverseflipflop;
  255.